//
//  main.c
//  函数的声明与常见终端命令
//
//  Created by ws on 2017/7/18.
//  Copyright © 2017年 王松. All rights reserved.
//

#include <stdio.h>
/**
 运行步骤: 编译 --> 链接 --> 运行
 
 编译C程序
 1.计算机只能识别0和1组成的机器指令,你现在写的这些什么int、main这些英文,它是看不懂的
 2.我们需要使用C语言编译器,将源文件翻译成只有0和1的二进制文件,这个翻译过程称为“编译”
 3.使用clang编译one.c文件：cc –c one.c
 4.编译器还有个很实用的功能：检测语法错误
 
 注意:编译器除了能将.c源文件编译成.o目标文件之外，还有一个非常重要的功能:语法检测.跟英语一样，C语言也有自己的语法，如果你不按照C语言语法去写代码,那就无法编译成功.生成目标文件之前,编译器会先检查.c文件是否有语法错误,如果出现语法错误,会列出错误的总个数、错误原因和错误代码的行号,这时候就不会产生目标文件;必须修正相应的语法错误,重新编译成功后,才会生成目标文件.
 
 
 链接C程序
 将所有相关联的.o目标文件、以及C语言函数库组合在一起生成可执行文件的过程,我们称为“链接”.
 
 1.源文件编译成功后,会生成一个.o目标文件,这就是一个二进制文件,但是,还是不能运行
 2.将所有相关联的.o目标文件、以及C语言函数库组合在一起生成可执行文件的过程,我们称为“链接”
 3.使用clang链接one.o文件:cc one.o
 
 注意点:源文件编译成功后,会生成一个.o目标文件,这就是一个二进制文件,但是,还是不能运行.目标文件不能运行的主要原因有2个:
 1> 在开发过程中,不可能将所有的代码都写在一个.c文件中,为了模块化开发,一般会将不同的功能写到不同的源文件中.源文件编译之后,每个源文件都有对应的.o文件,比如two.c生成了two.o、three.c生成了three.o,这些.o文件都不能单独运行,它们之间都有密不可分的关系,需要将所 有相关联的.o目标文件组合在一起.
 2> 除开组合所有的目标文件之后,还需要将C语言的函数库包含进来.才能生成可执行文件.
 
 */

/**
 函数的声明:就是把函数的头copy到调用函数的前面
 作用:告诉编译器这个函数已经存在了,你可以使用了
 
 一个完成的函数包含两部分:一个函数的声明,一个函数的实现(int类型的不许要声明)
 如果一个函数没有写明他的返回值类型,那么他的返回值类型是int类型
 函数的声明与定义(实现)务必保持一致
 */
int sum(int num1,int num2);//函数的声明
char numOfCharInTwoChar(char char1 ,char char2);

int main(int argc, const char * argv[]) {
    int a = 10;
    int b = 20;
    
    int result = sum(b,a);
    //编译器是从上往下编译的 如果没有声明函数,编译器就会报一个警告说没有发现这个函数(没有定义或者没有声明),所以要在上面声明一下这个函数,警告就没有了(声明函数:就是告诉编译器这个函数已经存在了)
    printf("--b==%d----%d\n",b,result);//--b==5.100000----30.400000
    
    numOfCharInTwoChar('a','A');
    return 0;
}

/**
 此方法写在main函数后面,如果不声明,那么在调用的时候会出现警告(implicit declaration of function 'sum' is invalid in C99:在C99中没有声明函数sum是无效的)
 */
int sum(int num1,int num2){
    num1 = 20.1;
    return num1 + num2;
}

/**
计算两个字节差多少字符
 */
char numOfCharInTwoChar(char char1 ,char char2){
    return  char1 - char2;
}

/**
 Mac系统采用的是UNIX文件系统，所有的文件都放在根目录/下面，因此没有Windows中分C盘、D盘的概念
 因为Mac系统是基于UNIX系统的，因此可以在“终端”中输入一些UNIX指令来操作Mac系统

 
 
 常用UNIX指令
 pwd:(查看当前的目录)查看当前窗口(文件)所在的目录(绝对路径) /Users/ws(最前面的斜杠就代表:Macintosh HD  Users:用户 ws:用户的名字) 电脑就这一个盘Macintosh HD
 ls:(查看当前路径下有什么内容)列出当前文件夹下面有什么内容
 cd:(跳转到其他的目录)切换路径(进入到下一文件)(cd Desktop/)
 cd ..:(转到上一级目录)
 ls -l:(查看详细信息)显示信息的详细列表(查看详细信息)
 touch a.c:(创建文件)创建一个名字为a的c文件
 open a.c: (打开文件或文件夹)打开文件
 touch b.c: 创建一个名字为b的c文件
 rm b.c: (删除文件)删除b.c文件(rm删除文件是彻底删除 废纸篓里面也没有)
 mkdir 6666:(创建文件夹)创建一个名字为6666的文件夹
 rmdir 6666:(删除文件夹,不能删除非空的文件夹)删除一个名字为6666的文件夹,废纸篓里面也没有
 open . :(打开文件或文件夹)表示打开当前目录(打开自己) (一个点".":表示当前路径  两个点"..":表示上级路径)
 cd .. :(回到上级目录)
 rm -r:(强制删除文件夹)强制删除文件夹(无论文件夹里面有没有内容都能删除 废纸篓里面也没有)
 rm -rf:(强制删除文件夹)强制删除文件夹(无论文件夹里面有没有内容 废纸篓里面也没有)
 clear:(清除的)只是让下面显示一部分空白,你在终端写的东西还存在,回滚鼠标还能看见前面的东西
 who:(查看当前目录是属于那个用户的)当前文件夹属于谁的
 

 
 
 mac文件目录:
 /:在路径的最前面就代表着当前的电脑的硬盘(称为根目录,也成为绝对路径)
 绝对路径:以"/"开头的路径我们都称为绝对路径
 相对路径:不是以"/"开头的路径我们都称为相对路径,相对于当前的路径(如果是cd Desktop/就是相对于/Users/ws下的路径)
 
  ****************用命令行编译一个文件****************************
 1:在终端cd到本文件夹的木录下
 2:$ cc -c main.c (生成main.o文件)
 3:$ cc main.o (链接main.o文件 生成可编译文件a.out文件)
 4:$ ./a.out
 *****************使用clang编译器编译、链接C程序******************
 1.编译one.c,生成one.o文件
  cc -c one.c
 
 2.链接one.o，生成a.out文件
   cc one.o
 
 3.运行a.out
   ./a.out
 
 使用clang编译器编译、链接C程序的命令
 这些指令不用去死记，大致有个了解，用到时再来查资料即可
 1.编译单个c源文件,并产生一个目标文件
  cc -c one.c
  这条命令产生一个名为one.o的目标文件
  
 2.编译多个c源文件,并为每个文件产生一个目标文件
  cc -c one.c two.c three.c
  这条命令产生3个目标文件：one.o、two.o、three.o
  
 3.链接单个目标文件
  cc one.o
  这条命令产生一个名为a.out的可执行文件
  
 4.链接多个目标文件
 cc one.o two.o three.o
 这条命令产生一个名为a.out的可执行文件
  
 5.编译并链接一个c源文件
 cc one.c这条命令产生一个名为a.out的可执行文件.中间会产生一个名为one.o的目标文件,但它在链接过程完成后会被删除。
  
 6.编译并链接多个c源文件
 cc one.c two.c three.c这条命令产生一个名为a.out的可执行文件.当编译的源文件超过一个时,目标文件便不会被删除.这就允许你对程序进行修改后,只对那些进行过改动的源文件进行重新编译。
  
 7.编译一个c源文件,并把它和现存的目标文件链接在一起
 cc one.o two.o three.c这条命令产生一个名为a.out的可执行文件
  
 8.上面那些可以产生可执行文件的指令均可以加上“-o name”这个选项,产生的可执行文件就叫做name
 比如 cc -o abc one.c这条指令会产生一个名为abc的可执行文件
  
 9.执行可执行文件
  ./a.out这条指令可以执行一个名为a.out的可执行文件

 */

